10.1 Maximiere den Rand, aber soft#

Lernziele

  • Sie kennen die Abkürzung SVM für Support Vector Machines.

  • Sie kennen die Idee, bei Support Vector Machines den Margin (= Randabstand) zu maximieren.

  • Sie wissen, was Stützvektoren bzw. Support Vectors sind.

  • Sie wissen, dass ein harter Randabstand nur bei linear trennbaren Datensätzen möglich ist.

  • Sie wissen, dass eigentlich nicht trennbare Datensätzen mit der Technik Soft Margin (= weicher Randabstand) dennoch klassifiziert werden können.

Welche Trenn-Gerade soll es sein?#

Mit Support Vactor Machines (SVM) wollen wir erneut binäre Klassifikationsprobleme lösen. Bisher haben wir bereits das Perzeptron und das logistische Regressionsmodell kennengelernt. Liegen nur wenige Datensätze vor, so ist das logistische Regressionsmodell empfehlenswert. Bei größeren Mengen an Trainingsdaten skaliert das SVM-Verfahren jedoch besser. Auch neigt es weniger zu Overfitting. Daher lohnt es sich, Support Vector Machines anzusehen.

Warum es weniger zu Overfitting neigt und mit Ausreißern besser umgehen kann, sehen wir bereits an der zugrundeliegenden Idee, die hinter dem Verfahren steckt. Um das Basis-Konzept der SVMs zu erläutern, besorgen wir uns zunächst künstliche Messdaten. Dazu verwenden wir die Funktion make_blobs aus dem Scikit-Learn-Modul. Mehr Details zum Aufruf der Funktion finden Sie in der Scikit-Learn-Dokumentation/make_blobs.

from sklearn.datasets import make_blobs

# generate artificial data
X, y = make_blobs(n_samples=60, centers=2, random_state=0, cluster_std=0.50)

print(X)
print(y)
[[ 1.4726926   1.3480769 ]
 [ 0.5323772   3.31338909]
 [ 1.74265969  5.03846671]
 [ 1.72330962  4.2012082 ]
 [ 0.4519936   3.59377836]
 [ 1.84845803  0.52393625]
 [ 1.61986895  0.60823883]
 [ 1.62465468  1.85269614]
 [ 3.01673853  1.63792106]
 [ 2.23345072  1.25095024]
 [ 1.60161834  0.92363636]
 [ 0.802314    4.38196181]
 [ 2.11872357  1.09865834]
 [ 1.05374379  4.49286859]
 [ 0.16932115  4.19741719]
 [ 0.92466065  4.50908658]
 [ 1.42002502  1.38236201]
 [ 0.12313498  5.27917503]
 [ 1.85367905  1.5088862 ]
 [ 1.89949126  0.92574633]
 [ 0.96217896  4.51795326]
 [ 1.35678894  4.36462484]
 [ 0.72144399  4.08475018]
 [ 0.64003985  4.12401075]
 [ 2.99684287  0.22378413]
 [ 0.56969694  3.44064603]
 [ 0.78260667  4.15263595]
 [ 1.45131429  4.22810872]
 [-0.30022483  4.63059663]
 [ 1.59141542  4.90497725]
 [ 1.92126584  1.29889186]
 [ 2.14398059  0.69677319]
 [ 2.20438661  1.56085661]
 [ 0.99914934  4.2101954 ]
 [ 1.91004907  3.81514839]
 [ 1.19820169  4.47062449]
 [ 2.79939362  1.84560825]
 [ 0.72086751  3.71347124]
 [ 1.51989121  1.42488952]
 [ 2.62496786  0.28025075]
 [ 2.4198128   0.96215512]
 [ 0.3498724   4.69253251]
 [ 2.24348029  0.34796326]
 [ 1.13280393  3.87673946]
 [ 0.65910903  4.12241674]
 [ 2.11114739  3.57660449]
 [ 2.52889351  0.82015861]
 [ 1.24016835  1.12905479]
 [ 2.989047    1.35068599]
 [ 2.15940501  1.38598318]
 [ 1.46870582  1.86947425]
 [ 1.00952869  4.45502328]
 [ 2.06051753  1.79059891]
 [ 1.04829186  5.03092408]
 [ 0.5285368   4.49723858]
 [ 2.64465731  0.80770124]
 [ 2.36230721  1.358767  ]
 [ 1.40848818  3.93270482]
 [ 2.28809874  0.12954182]
 [ 2.25643834  0.55525861]]
[1 0 0 0 0 1 1 1 1 1 1 0 1 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 1
 0 1 1 1 0 1 0 0 0 1 1 1 1 1 0 1 0 0 1 1 0 1 1]

Die Funktion make_blobs erzeugt standardmäßig zwei Input-Features, da die Option n_features auf den Wert 2 voreingestellt ist, und einen Output, bei dem die Labels entweder durch 0 oder 1 gekennzeichnet sind. Durch die Option random_state=0 wird der Zufall ausgeschaltet.

Wenn wir die Daten visualisieren, erhalten wir folgenden Plot.

import plotly.express as px

fig = px.scatter(x = X[:,0], y = X[:,1],  color=y, color_continuous_scale=['#3b4cc0', '#b40426'],
                 title='Künstliche Daten',
                 labels={'x': 'Feature 1', 'y': 'Feature 2'})
fig.show()

Wir können uns jetzt verschiedene Geraden vorstellen, die die blauen Punkte von den roten Punkten trennen. In der folgenden Grafik sind drei eingezeichnet. Welche würden Sie nehmen und warum?

../_images/fig10_01_annotated.pdf

Fig. 12 Drei Geraden trennen die roten von den blauen Punkten, aber welche ist die bessere Wahl?#

Alle drei Geraden trennen die blauen von den roten Punkten. Jedoch könnte Gerade 3 problematisch werden, wenn beispielsweise ein neuer blauer Datenpunkt an der Position (2.3, 3.3) dazukäme. Dann würde Gerade 3 diesen Punkt als rot klassifizieren. Ähnlich verhält es sich mit Gerade 1. Ein neuer blauer Datenpunkt an der Position (0.5, 3) würde fälschlicherweise als rot klassifiziert werden. Gerade 2 bietet den sichersten Abstand zu den bereits vorhandenen Datenpunkten. Wir können diesen “Sicherheitsstreifen” folgendermaßen visualisieren.

../_images/fig10_02_annotated.pdf

Fig. 13 Ein Sicherheitsstreifen bzw. breiter Rand, im Englischen Margin genannt, trennt die beiden Klassen.#

Der Support-Vector-Algorithmus sucht nun die Gerade, die die Datenpunkte mit dem größten Randabstand (= Margin) voneinander trennt. Im Englischen sprechen wir daher auch von Large Margin Classification. Die Suche nach dieser Geraden ist dabei etwas zeitaufwändiger als die Berechnung der Gewichte bei der logistischen Regression. Wenn aber einmal das Modell trainiert ist, ist die Prognose effizienter, da nur die sogenannten Stützvektoren, auf englisch Support Vectors gespeichert und ausgewertet werden. Die Stützvektoren sind die Vektoren, die vom Ursprung des Koordinatensystems zu den Punkten zeigen, die auf der Grenze des Sicherheitsbereichs liegen.

../_images/fig10_03.pdf

Fig. 14 Einige wenige Punkte (gelb markiert) bestimmen den Verlauf des Randabstandes. Die Vektoren, die vom Ursprung des Koordinatensystems zu diesen Punkten zeigen, werden Stützvektoren (= Support Vectors) genannt.#

Großer, aber weicher Randabstand#

Bei dem oben betrachteten Beispiel lassen sich blaue und rote Datenpunkte komplett voneinander trennen. Für den Fall, dass einige wenige Datenpunkte “falsch” liegen, erlauben wir Ausnahmen. Wie viele Ausnahmen wir erlauben wollen, die im Sicherheitsstreifen liegen, steuern wir mit dem Parameter C. Ein großes C bedeutet, dass wir eine große Mauer an den Grenzen des Sicherheitsabstandes errichten. Es kommt kaum vor, dass Datenpunkte innerhalb des Margins liegen. Je kleiner C wird, desto mehr Datenpunkte sind innerhalb des Sicherheitsbereichs erlaubt.

Im Folgenden betrachten wir einen neuen künstlichen Datensatz, bei dem die blauen von den roten Punkte nicht mehr ganz so stark getrennt sind. Schauen Sie sich die fünf verschiedenen Margins an, die entstehen, wenn der Parameter C variiert wird.

Zusammenfassung#

In diesem Abschnitt haben wir die Ideen kennengelernt, die den Support Vector Machines zugrunde liegen. Im nächsten Abschnitt schauen wir uns an, wie ein SVM-Modell mit Scikit-Learn trainiert wird.